package main

func main() {
	nums := []int{1, 2, 3, 4, 5, 6, 7}
	k := 3
	//nums := []int{-1, -100, 3, 99}
	//k := 2

	rotate(nums, k)

	for _, i := range nums {
		print(i, ",")
	}
}

// 189. 轮转数组
func rotate(nums []int, k int) {
	// 直接换辅助数组吧
	numLen := len(nums)
	originalNums := make([]int, numLen)
	for idx, n := range nums {
		originalNums[idx] = n
	}

	for i := 0; i < len(nums); i++ {
		offset := (i + k) % numLen
		nums[offset] = originalNums[i]
	}
}

// 189. 轮转数组
func rotateError(nums []int, k int) {
	// 有问题，可能会遍历不到部分元素，直接换辅助数组吧
	numLen := len(nums)
	if k%numLen == 0 || len(nums) == 0 {
		return
	}

	point := 0
	preNum := nums[0]
	for i := 1; i <= numLen; i++ {
		point = (point + k) % numLen
		preNum, nums[point] = nums[point], preNum
	}
	return
}

// 给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
//
//示例 1:
//
//输入: nums = [1,2,3,4,5,6,7], k = 3
//输出: [5,6,7,1,2,3,4]
//解释:
//向右轮转 1 步: [7,1,2,3,4,5,6]
//向右轮转 2 步: [6,7,1,2,3,4,5]
//向右轮转 3 步: [5,6,7,1,2,3,4]
//示例 2:
//
//输入：nums = [-1,-100,3,99], k = 2
//输出：[3,99,-1,-100]
//解释:
//向右轮转 1 步: [99,-1,-100,3]
//向右轮转 2 步: [3,99,-1,-100]
